package tools;

import java.io.File;
import java.io.IOException;
import java.lang.ProcessBuilder.Redirect;
import java.util.Properties;


public final class SystemTool {

	/**
	 * 执行命令
	 * 
	 * @param command
	 *            命令指令
	 * @return 执行成功与否
	 */
	public static boolean CmdRun(String command) {

		boolean rs = false;
		if (command.length() > 0) {
			try {
				Runtime.getRuntime().exec(command);// 运行cmd命令
				rs = true;
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return rs;
	}

	/**
	 * 重启系统
	 */
	public static void RestartSystem() {
		String OS = getSystemName().toLowerCase();
		String comd = "abc";
		System.out.println(OS);
		if (OS.indexOf("win") >= 0) {
			comd = new String("shutdown -r");
		} else if (OS.indexOf("mac") >= 0) {
			comd = new String("sudo shutdown -r now");
		} else if (OS.indexOf("nux") >= 0) {
			comd = new String(File.separator+"sbin"+File.separator+"reboot");
		}
		boolean rs = CmdRun(comd);
	}

	/**
	 * 获取系统相关内容 String osName = props.getProperty("os.name"); //操作系统名称 String osArch
	 * props.getProperty("os.arch"); //操作系统构架 String osVersion
	 * props.getProperty("os.version"); //操作系统版本
	 */
	public static Properties getSystemProperties() {
		Properties props = System.getProperties(); // 获得系统属性集
		
		return props;
	}

	/**
	 * 获取系统名称
	 */
	public static String getSystemName() {
		return getSystemProperties().getProperty("os.name");
	}

	/**
	 * 获取当前jar包的名称
	 * @return
	 */
	public static String getJarname() {
		String jarpath = null;
		String jarName = null;
		try {
			jarpath = System.getProperty("java.class.path");//C:\Users\KK\Desktop\lin.jar//C:/Users/KK/Desktop/lin.jar
			if(jarpath != null) {
				int loc = jarpath.lastIndexOf(File.separator);//地址斜杠最后一次出现的位置
				if(loc >= 0) {
					jarName = jarpath.substring(loc+1);
				}
			}
			else {
				jarpath = SystemTool.class.getProtectionDomain().getCodeSource().getLocation().getPath();
				if(jarpath != null) {
					int loc = jarpath.lastIndexOf(File.separator);//地址斜杠最后一次出现的位置
					if(loc >= 0) {
						jarName = jarpath.substring(loc+1);
					}
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return jarName;
	}
	
	
	/**
	 * 重启JAR,如果重启失败就重启系统
	 */
	public static void restartJar() {
		String Commd = "service "+getJarname()+" restart";
		try {
			asynExeLocalComand(null,Commd);
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			RestartSystem();
		}
	}
	
	
	public static void asynExeLocalComand(File file, String... command) throws IOException {
		// 不使用Runtime.getRuntime().exec(command)的方式,因为无法设置以下特性
		// Java执行本地命令是启用一个子进程处理,默认情况下子进程与父进程I/O通过管道相连(默认ProcessBuilder.Redirect.PIPE)
		// 当服务执行自身重启的命令时,父进程关闭导致管道连接中断,将导致子进程也崩溃,从而无法完成后续的启动
		// 解决方式,(1)设置子进程IO输出重定向到指定文件;(2)设置属性子进程的I/O源或目标将与当前进程的相同,两者相互独立
		ProcessBuilder pb = new ProcessBuilder(command);
		if (file == null || !file.exists()) {
		// 设置属性子进程的I/O源或目标将与当前进程的相同,两者相互独立
		pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
		pb.redirectError(ProcessBuilder.Redirect.INHERIT);
		pb.redirectInput(ProcessBuilder.Redirect.INHERIT);
		} else {
		// 设置子进程IO输出重定向到指定文件
		// 错误输出与标准输出,输出到一块
		pb.redirectErrorStream(true);
		// 设置输出日志
		pb.redirectOutput(Redirect.appendTo(file));
		}
		// 执行命令进程
		pb.start();
	}

}
